// move函数
// 移动动画
//  参数     1，对象   2，要进行动画的属性   3，目标距离  4，速度（一次运动的距离）  5，getstyle回调函数   
// function move(obj, sttr, target, speed, callback) {
//     // 获取目标当前位置  判断speed为正还是未负
//     var current = parseInt(getstyle(obj, sttr));
//     if (current > target) {
//         speed = -speed;
//     }
//     clearInterval(obj.timer);
//     // 绑定定时器
//     obj.timer = setInterval(function () {
//         // 获取移动前的偏移量
//         // parsent是为了取出数字有效值进行计算
//         var oldvalue = parseInt(getstyle(obj, sttr));
//         var newvalue = oldvalue + speed;

//         if ((speed < 0 && newvalue < target) || (speed > 0 && newvalue > target)) {
//             newvalue = target;
//         };
//         obj.style[sttr] = newvalue + "px";
//         if (newvalue == target) {
//             clearInterval(obj.timer);
//             callback && callback();
//         };
//     }, 30);
// };



/**
 * 动画函数
 * @param {node} ele 要运动的元素
 * @param {object} obj 要运动的属性组成的对象
 */
function move(ele, obj, fn = function () { }) {
    var k = 0
    var n = 0
    for (let attr in obj) {
        k++
        let target = obj[attr]
        let style = getstyle(ele, attr)
        let timerId = setInterval(function () {


            if (attr === 'opacity') {
                style *= 100
                target *= 100
            }
            style = parseInt(style)
            var diff = target - style;
            var speed = diff / 20
            if (speed > 0) {
                speed = Math.ceil(speed)
            } else {
                speed = Math.floor(speed)
            }
            style += speed
            if (style === target) {
                style = target
                if (attr === 'opacity') {
                    ele.style[attr] = style / 100
                } else {
                    ele.style[attr] = style + "px"
                }
                clearInterval(timerId)
                n++
                if (n === k) {
                    fn()
                }
            } else {
                if (attr === 'opacity') {
                    ele.style[attr] = style / 100
                } else {
                    ele.style[attr] = style + "px"
                }
            }

        }, 20)
    }
}




// 缓动动画
// 参数    1，执行动画的对象    2，目标距离   3，动画执行完毕后的回调函数
function animate(obj, target, callback) {

    clearInterval(obj.timer);

    obj.timer = setInterval(function () {
        // 步长值   --->    整数，不能出现小数
        var step = (target - obj.offsetLeft) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        if (obj.offsetLeft == target) {

            clearInterval(timer);
            // 结束动画后执行回调函数
            if (callback) {
                // 如果有回调函数  ，则执行   没有则不执行
                callback();
            }
        }

        obj.style.left = obj.offsetLeft + step + 'px';

    }, 15);
}



// 添加类
function addClass(obj, cn) {
    if (!hasClass(obj, cn)) {
        obj.className += " " + cn;
    };
};
// 检查是否含有该类
function hasClass(obj, cn) {
    var reg = new RegExp("\\b" + cn + "\\b");

    return reg.test(obj.className);
};
// 删除类
function remove(obj, cn) {
    var reg = new RegExp("\\b" + cn + "\\b");

    obj.className = obj.className.replace(reg, "");
};
// 切换  如果有则删除   如果没有则添加
function toggleClass(obj, cn) {
    if (hasClass(obj, cn)) {
        remove(obj, cn);
    } else {
        addClass(obj, cn);
    };
};



// 获取随机数函数    
// a和b为取值范围
function getRandom(a, b) {
    var max = a;
    var min = b;
    if (a < b) {
        max = b;
        min = a;
    }
    return parseInt(Math.random() * (max - min)) + min
}
// 随机获取颜色
function getColor() {
    color = '#'
    for (var i = 0; i < 3; i++) {
        var num = getRandom(0, 256)
        num = num.toString(16)
        if (num.length == 1) {
            color += '0' + num
        }
        color += num
    }
    return color
}


// 绑定事件
function BindEvent(ele, type, handler) {
    if (ele.addEveneListener) {
        ele.addEveneListener(type, handler)
    } else if (ele.attchEvent) {
        ele.attchEvent('on' + type, handler)
    } else {
        ele['onclick'] = handler
    }
}
// 解绑事件
function unBindEvent(ele, type, handler) {
    if (ele.removeEveneListener) {
        ele.removeEveneListener(type, handler)
    } else if (ele.detchEvent) {
        ele.detchEvent('on' + type, handler)
    } else {
        ele['onclick'] = null
    }
}


// 获取元素样式的函数  obj为获取的对象   name为要获取的样式
function getstyle(obj, name) {
    if (window.getComputedStyle) {
        return getComputedStyle(obj, null)[name];
    } else {
        return currentStyle[name];
    };
};
// 设置样式函数
function setStyle(ele, obj) {
    for (var i in obj) {
        ele.style[i] = obj[i]
    }
}


// 获取cookie
function getCookie(key) {
    var cookies = document.cookie;
    var arr = cookies.split("; ")
    for (var i = 0; i < arr.length; i++) {
        var brr = arr[i].split('=')
        if (brr[0] === key) {
            return brr[1]
        }
    }
}
// 设置cookie
function setCookie(key, value, seconds, path = '/') {
    var date = new Date()
    date.setTime(date.getTime() + seconds * 1000 - 8 * 3600 * 1000)
    document.cookie = `${key}=${value};expires=${date};path=${path}`
}
// 删除cookie
function removeCookie(key, path = "/") {
    setCookie(key, null, -20, path)
}



function sendAjax(obj) {
    // 判断传入的method参数是否为空
    if (obj.method == undefined) {
        obj.method = 'get'
    }
    if (obj.method !== 'get' && obj.method !== 'post') {
        throw new Error('请求方式不合法')
    }
    // 判断是否传入obj.async  如果没有，则设置为true
    if (obj.async == undefined) {
        obj.async = true
    }
    // 判断是否异步的参数是否为布尔值
    if (Object.prototype.toString.call(obj.async) !== '[object Boolean]') {
        throw new Error("obj.async必须是布尔值")
    }
    // 判断传入的地址是否为字符串
    if (obj.url == undefined) {
        throw new Error("地址不合法")
    }
    if (Object.prototype.toString.call(obj.url) !== '[object String]') {
        throw new Error("地址不合法")
    }
    if (obj.data !== undefined) {
        if (Object.prototype.toString.call(obj.data) == '[object String]') {
            str = obj.data
        } else if (Object.prototype.toString.call(obj.data) == '[object Object]') {
            var str = ''
            var str1 = ''
            for (var attr in obj.data) {
                str += str1 + attr + '=' + obj.data[attr]
                str1 = '$'
            }
        } else {
            throw new Error("obj.data必须是字符串或者对象")
        }
        if (obj.method === 'get') {
            obj.url = obj.url + "?" + str
        }
    }
    if (obj.dataType != undefined) {
        if (obj.dataType !== 'xml' && obj.dataType !== 'json') {
            throw new Error('obj.dataType必须是xml或者json')
        }
    }
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status >= 200 && xhr.status < 300) {
                if (obj.dataType == 'xml') {
                    var res = xhr.responseXML
                } else if (obj.dataType == 'json') {
                    var res = JSON.parse(xhr.responseText)
                } else {
                    var res = xhr.responseText
                }
                obj.success(res)
            } else {
                obj.error()
            }
        }
    }
    xhr.open(obj.method, obj.url, obj.async)
    if (obj.data && obj.method === 'post') {
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
        xhr.send(str)
        return false
    }
    xhr.send()
}


// 封装promise函数 发送请求
function promiseSendAjax(obj) {
    return new Promise(function (resolve, reject) {
        // 判断传入的method参数是否为空
        if (obj.method == undefined) {
            obj.method = 'get'
        }
        if (obj.method !== 'get' && obj.method !== 'post') {
            throw new Error('请求方式不合法')
        }

        // 判断是否传入obj.async  如果没有，则设置为true
        if (obj.async == undefined) {
            obj.async = true
        }
        // 判断是否异步的参数是否为布尔值
        if (Object.prototype.toString.call(obj.async) !== '[object Boolean]') {
            throw new Error("obj.async必须是布尔值")
        }
        // 判断传入的地址是否为字符串
        if (obj.url == undefined) {
            throw new Error("地址不合法")
        }
        if (Object.prototype.toString.call(obj.url) !== '[object String]') {
            throw new Error("地址不合法")
        }
        if (obj.data !== undefined) {
            if (Object.prototype.toString.call(obj.data) == '[object String]') {
                str = obj.data
            } else if (Object.prototype.toString.call(obj.data) == '[object Object]') {
                var str = ''
                var str1 = ''
                for (var attr in obj.data) {
                    str += str1 + attr + '=' + obj.data[attr]
                    str1 = '$'
                }
            } else {
                throw new Error("obj.data必须是字符串或者对象")
            }

            if (obj.method === 'get') {
                obj.url = obj.url + "?" + str
            }
        }
        if (obj.dataType != undefined) {
            if (obj.dataType !== 'xml' && obj.dataType !== 'json') {
                throw new Error('obj.dataType必须是xml或者json')
            }
        }
        var xhr = new XMLHttpRequest()
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status >= 200 && xhr.status < 300) {
                    if (obj.dataType == 'xml') {
                        var res = xhr.responseXML
                    } else if (obj.dataType == 'json') {
                        var res = JSON.parse(xhr.responseText)
                    } else {
                        var res = xhr.responseText
                    }
                    resolve(res)
                } else {
                    reject(res)
                }
            }
        }
        xhr.open(obj.method, obj.url, obj.async)
        if (obj.data && obj.method === 'post') {
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            xhr.send(str)
            return false
        }
        xhr.send()
    })
}